#ifndef PROCESSOSUSUARIO_H_INCLUDED
#define PROCESSOSUSUARIO_H_INCLUDED

#include "FilaProcesso.h"

typedef struct ProUsuario
{
    int nPrioridade;

    TFila * processos;

}TProUsuario;

typedef struct ListaProUsuario
{
    TProUsuario*      proUsuario;

    struct ListaProUsuario* prox;

}TListaProUsuario;


TProUsuario* ProUsuario_criar()
{
    TProUsuario* procUsuario = (TProUsuario*) malloc( sizeof (TProUsuario));
    procUsuario->nPrioridade = -1;
    procUsuario->processos = Fila_Criar();
    return procUsuario;
}

TListaProUsuario* ProUsuario_criarLista()
{
    TListaProUsuario* listaProcUsuario = (TListaProUsuario*) malloc( sizeof (TListaProUsuario));
    listaProcUsuario->proUsuario = ProUsuario_criar();
    listaProcUsuario->prox = NULL;
    return listaProcUsuario;
}

TListaProUsuario* ProUsuario_buscar(TListaProUsuario* _pPU, const int prioridade)
{
    TListaProUsuario* p = _pPU;
    while(p)
    {
        if(p->proUsuario->nPrioridade == prioridade )
          return p;

        p = p->prox;
    }

    return NULL;
}

TListaProUsuario* ProUsuario_inserir_ordenado(TListaProUsuario* _pPU, TProcesso _pUsuario, const int prioridade)
{
    TListaProUsuario* pNovo;
    //printf("\nPRIORIDADE %d",prioridade);
    pNovo = ProUsuario_buscar(_pPU,prioridade);
    if(pNovo)
    {
        //printf("\n ACHOU PRIORIDADE %d",prioridade);
        Fila_Inserir(pNovo->proUsuario->processos,_pUsuario);
        return _pPU;
    }

    pNovo = ProUsuario_criarLista();
    pNovo->proUsuario->nPrioridade=prioridade;

    TListaProUsuario* ant = NULL,*p = _pPU;
    while(p)
    {
        if(p->proUsuario->nPrioridade >= prioridade)
           break;

        ant = p;
        p = p->prox;
    }

    Fila_Inserir(pNovo->proUsuario->processos,_pUsuario);

    if(ant == NULL)
    {
        pNovo->prox = _pPU;
        _pPU = pNovo;
    }
    else
    {
        pNovo->prox = p;
        ant->prox = pNovo;
    }

    return _pPU;
}

void ProUsuario_ImprimirEstado(TListaProUsuario* _pPU)
{
    TListaProUsuario* p = _pPU;
    while(p)
    {
        printf("\n\n \t \t PRIORIDADE %d",p->proUsuario->nPrioridade);
        TFila * filaProcessos = p->proUsuario->processos;

        if(filaProcessos)
           Fila_Imprimir(filaProcessos);
        else
            printf("Sem processos de prioridade %d",p->proUsuario->nPrioridade);

        p=p->prox;
    }
}


void ProUsuario_Libera(TListaProUsuario* _pPU)
{

   TListaProUsuario* p = _pPU;
    while(p)
    {
        TFila * filaProcessos = p->proUsuario->processos;
        Fila_Libera(filaProcessos);
        TListaProUsuario* q =p;
        p=p->prox;

        free(q);
    }
}

#endif // PROCESSOSUSUARIO_H_INCLUDED
